#pragma once

#include <functional>
#include "Protocol.hpp"
#include "searcher.hpp"
#include "util.hpp"

// 用于指定服务器默认读取文件
const std::string default_root_path = "./wwwroot/index.html";

// 设置回调
using service_t = std::function<Response (const Request &req, ns_searcher::Searcher &)>;

// 返回响应
static Response SearchResult(const Request &req, ns_searcher::Searcher &search)
{
    // 创建响应对象
    Response resp;

    // 请求的是主界面, 返回构建好报头的html信息
    std::string html;
    if(req.path == default_root_path)
    {
        // 读取html的信息
        ns_util::FileUtil::ReadFile(req.path, &html);
        // 构建报头
        resp.html_string = "HTTP/1.1 200 OK\r\n";
        resp.html_string += "Content-Type: text/html\r\n"; // 返回的类型为html文档形式
        resp.html_string += ("Content-Length: " + std::to_string(html.size()) + "\r\n");
        resp.html_string += "\r\n";
        // 加上html信息
        resp.html_string += html;

        return resp;
    }
    // 请求的搜索内容, 搜索后返回构建好报头的响应
    else
    {
        // 获取word参数的值
        std::string word = req.path.substr(req.path.find("word") + 5, req.path.rfind(SPACE));
        LogMessage(INFO, "用户在搜索: %s", word.c_str());

        // 调用Search根据word查找对应的内容, 并存储到json_string中(这里存储的是Json格式的内容)
        search.Search(word, &resp.json_string);

        // 构建报头
        std::string prev_string;
        prev_string = "HTTP/1.1 200 OK\r\n";
        prev_string += "Content-Type: application/json\r\n"; // 返回的类型为json字符串形式
        prev_string += ("Content-Length: " + std::to_string(resp.json_string.size()) + "\r\n");
        prev_string += "\r\n";
        // 加上搜索到的json字符串信息
        prev_string += resp.json_string;
        resp.json_string = prev_string;

        return resp;
    }
}
